#include "03_header.h"
#include <mysql/mysql.h>
#include <unistd.h>

//void show_dir(int netfd,char* cur_dir,int len){
//    write(netfd,cur_dir,len);
//}
//int jump_to_dir(char* cur_dir,MYSQL* db){
//    int retid=-1;
//    char temp[30]={0};
//    char* pointer=cur_dir;
//    int count=0;
//    MYSQL_RES *result;
//    MYSQL_ROW row;
//    char sql[100]="select * from file_info where parent_id = ";
//    char next_sql[100]=" && username = ";
//    char charid[4];
//    while(pointer!=NULL){
//        if(*pointer!='/'){
//            temp[count++]=*pointer++;
//        }
//        else{
//            count=0;
//            pointer++;
//            if(retid==-1){
//                charid[0]='-';
//                charid[1]='1';
//            }
//            else{
//                int temp_count=0;
//                char now[4]={0};
//                int temp_id=retid;
//                int left_num;//取余数
//                while(temp_id>0){
//                    left_num=temp_id%10;
//                    now[temp_count++]=left_num+48;
//                    temp_id/=10;//用栈容器取余数，然后反向输入回去
//                }
//                for(int i=temp_count;i>0;i--){
//                    charid[count++]=now[i-1];
//                }
//                count=0;
//                strcat(sql,charid);
//                strcat(sql,next_sql);
//                strcat(sql,temp);
//                int sqret=mysql_query(db,sql);                                                                             
//                if(sqret==-1){
//                    printf("error is:%s\n",mysql_error(db));
//                    return -1;
//                }
//                result=mysql_store_result(db);//db是这个接口，用这个接口
//                if(result==NULL){
//                    printf("Error is%s\n",mysql_error(db));
//                    return -1;
//                }
//                row=mysql_fetch_row(result);
//                retid=atoi(row[0]);
//            }
//            pointer++;
//        }
//    }
//    return retid;
//}
int add_dir(char* cur_dir,char* username,char* dirname, int pwd, MYSQL* db){
    int retid=pwd;
    printf("retid = %d\n", retid);
    char new_path[512] = {0};//新路径
    snprintf(new_path, sizeof(new_path), "%s%s/", cur_dir, dirname);
    printf("new_path = %s.\n", new_path);
    char sql[1024];
    snprintf(sql, sizeof(sql),
             "INSERT INTO file_info (filename, username, parent_id, type, path, MD5) VALUES ('%s', '%s', %d, 'd', '%s', NULL)",
             dirname, username, retid, new_path);
    printf("tmpPath = %s.\n", cur_dir);
    //    strcat(sql,dirname);
    //    strcat(sql,"','");
    //    strcat(sql,username);
    //    strcat(sql,"',");
    //    char charid[4]={0};
    //    int count=0;
    //    int temp_count=0;
    //    char now[4]={0};
    //    int temp_id=retid;
    //    int left_num;//取余数
    //    while(temp_id>0){
    //        left_num=temp_id%10;
    //        now[temp_count++]=left_num+48;
    //        temp_id/=10;//用栈容器取余数，然后反向输入回去
    //    }
    //    for(int i=temp_count;i>0;i--){
    //        charid[count++]=now[i-1];
    //    }
    //    strcat(sql,charid);
    //    strcat(sql,",'d','");
    //    strcat(sql,cur_dir);
    //    strcat(sql,"')");
    //    int sqret=mysql_query(db,sql);
    //    if(sqret==-1){
    //        printf("error is%s\n",mysql_error(db));
    //        return -1;
    //    }
    if (mysql_query(db, sql)) {
        fprintf(stderr, "mkdir 操作失败: %s\n", mysql_error(db));
        return -1;
    }

    printf("目录 '%s' 创建成功，目录path在 '%s'\n", dirname, cur_dir);
    return 0;
}
int remove_dir(char* cur_dir,char* dirname, int *pwd, MYSQL* db){
    char buf[300];
    strcat(buf,cur_dir);
    strcat(buf,"/");
    strcat(buf,dirname);
    int retid=*pwd;
    char sql[500]="delete from file_info where id=";
    char charid[4]={0};
    int count=0;
    int temp_count=0;
    char now[4]={0};
    int temp_id=retid;
    int left_num;//取余数
    while(temp_id>0){
        left_num=temp_id%10;
        now[temp_count++]=left_num+48;
        temp_id/=10;//用栈容器取余数，然后反向输入回去
    }
    for(int i=temp_count;i>0;i--){
        charid[count++]=now[i-1];
    }
    strcat(sql,charid);
    int sqret=mysql_query(db,sql);
    if(sqret==-1){
        printf("error is%s\n",mysql_error(db));
        return -1;
    }
    return 0;
}
//void list_dir(int pwd, char *nameList, MYSQL* db){
//    printf("list_dir go in success.\n");
//    int retid = pwd;
//    printf("retid = %d.\n", retid);
//    char buf[300];
//    char sql[500]="select username from file_info where parent_id=";
//    MYSQL_RES* result;
//    MYSQL_ROW row;
//    char charid[4]={0};
//    int count=0;
//    int temp_count=0;
//    char now[4]={0};
//    int temp_id=retid;
//    int left_num;//取余数
//    int offset = 0;
//    while(temp_id>0){
//        left_num=temp_id%10;
//        now[temp_count++]=left_num+48;
//        temp_id/=10;//用栈容器取余数，然后反向输入回去
//    }
//    for(int i=temp_count;i>0;i--){
//        charid[count++]=now[i-1];
//    }
//    strcat(sql,charid);
//    printf("sql = %s.\n", sql);
//    int sqret=mysql_query(db,sql);
//    printf("sqret = %d.\n", sqret);
//    if(sqret==-1){
//        printf("error is%s\n",mysql_error(db));
//        return;
//    }
//    result=mysql_store_result(db);
//    bzero(buf,sizeof(buf));
//    while((row=mysql_fetch_row(result))!=NULL){
//        offset += sprintf(buf + offset, "%s ", row[0]);
//    }
//    printf("buf = %s.\n", buf);
//    strcpy(nameList, buf);
//}

void list_dir(int pwd, char *nameList, MYSQL* db) {
    printf("list_dir go in success.\n");
    printf("pwd = %d.\n", pwd);

    // 1. 构建SQL查询
    char sql[500];
    snprintf(sql, sizeof(sql), "SELECT filename FROM file_info WHERE parent_id=%d", pwd);
    printf("SQL: %s\n", sql);

    // 2. 执行查询
    if(mysql_query(db, sql)) {
        printf("查询失败: %s\n", mysql_error(db));
        nameList[0] = '\0'; // 确保返回空字符串
        return;
    }

    // 3. 获取结果集
    MYSQL_RES* result = mysql_store_result(db);
    if(result == NULL) {
        printf("无结果或获取结果集失败: %s\n", mysql_error(db));
        nameList[0] = '\0';
        return;
    }

    // 4. 处理结果
    char buf[300] = {0};
    int offset = 0;
    MYSQL_ROW row;

    while((row = mysql_fetch_row(result))) {
        if(row[0] != NULL) {  // 确保字段不为NULL
            offset += snprintf(buf + offset, sizeof(buf) - offset, "%s ", row[0]);
        }
    }

    printf("查询结果: %s\n", buf);
    if(strlen(buf)==0){
        strncpy(nameList, " ", 1);
        mysql_free_result(result);
        return;
    }
    strncpy(nameList, buf, sizeof(buf));  // 安全拷贝

    // 5. 释放结果集
    mysql_free_result(result);
}
//void change_dir(char* cur_dir,char* command){
//    char* pointer=command;
//    char temp_dir[1024];
//    int flag;
//    int buf_index=0;
//    int temp_dir_index;
//    int count=0;
//    char buf[50];
//    strcpy(temp_dir,cur_dir);
//    temp_dir_index=strlen(temp_dir);
//    int stack[100];
//    for(int i=0;i<(int)strlen(temp_dir);i++){
//        if(temp_dir[i]=='/'){
//            stack[count++]=i;
//        }
//    }
//    if(*pointer=='/') strcpy(cur_dir,command);//默认目录的第一个字符是/
//    else if(*pointer=='~'){
//        strcpy(temp_dir,"/home");
//        strcat(temp_dir,command);
//        strcpy(cur_dir,temp_dir);
//    }
//    else{
//        while(*pointer!='\0'){
//        if(*pointer=='/') pointer++;
//        buf_index=0;
//        buf[buf_index++]='/';
//        flag=0;
//        while(*pointer!='/'&&*pointer!='\0'){
//            if(*pointer=='.'&&flag!=3){
//                flag++;
//            }
//            else{
//                flag=3;
//            }
//            buf[buf_index++]=*pointer++;
//        }
//        if(flag==2){
//            temp_dir_index=stack[--count];
//            temp_dir[temp_dir_index]='\0';
//        }
//        if(flag==3){
//            strcat(temp_dir,buf);
//        }
//        bzero(buf,sizeof(buf));
//    }
//    }
//    strcpy(cur_dir,temp_dir);
//    //show_dir(netfd,cur_dir,strlen(cur_dir));
//    return;
//}
void change_dir(char* cur_dir, char* command, char *username, int *pwd, MYSQL* db) {
    MYSQL_RES *res;
    MYSQL_ROW row;
    char query[1024];

    //// 获取根目录路径
    //snprintf(query, sizeof(query), 
    //    "SELECT path FROM file_info WHERE username='%s' AND parent_id=-1 AND type='d' LIMIT 1",
    //    username
    //);
    //if (mysql_query(db, query)) {
    //    fprintf(stderr, "查询根目录失败: %s\n", mysql_error(db));
    //    return;
    //}
    //if (!(res = mysql_store_result(db))) {
    //    fprintf(stderr, "获取结果集失败: %s\n", mysql_error(db));
    //    return;
    //}
    //if (!(row = mysql_fetch_row(res)) || !row[0]) {
    //    fprintf(stderr, "用户根目录不存在\n");
    //    mysql_free_result(res);
    //    return;
    //}
    //char root_path[256];
    //strncpy(root_path, row[0], sizeof(root_path)-1);
    //mysql_free_result(res);

    //// 解析根目录层级
    //char root_parts[10][256];
    //int root_depth = 0;
    //char *token = strtok(root_path, "/");
    //while (token && root_depth < 10) {
    //    strcpy(root_parts[root_depth++], token);
    //    token = strtok(NULL, "/");
    //}

    // 构建目标路径
    char target_path[512] = {0};
    snprintf(target_path, sizeof(target_path), "%s%s%s", 
             cur_dir, 
             command,
             "/"
            );//如：输入cd dir1，target_path应为"aaa/dir1/"
              //输入cd ..，aaa/../

    // 分割路径为层级结构
    char parts[100][256];
    int part_cnt = 0;
    char tmp[512];
    strncpy(tmp, target_path, sizeof(tmp)-1);//tmp应为aaa/dir1/(aaa/../)
    char *token = strtok(tmp, "/");//token应为aaa
    strcpy(parts[part_cnt], token);
    while (token && part_cnt < 100) {//把第一个(根目录)以外的部分装进parts里
                                     //如parts[0] = "aaa", parts[1] = "dir1"
        if(strcmp(token, "..") == 0){
            part_cnt--;
        }
        else if (strcmp(token, ".")== 0){

        }
        else{
            strcpy(parts[++part_cnt], token);
        }
        token = strtok(NULL, "/");
    }


    //// 使用栈处理路径规范
    //char stack[100][256];
    //int top = 0;

    //// 初始化栈（根目录层级）
    //for (int i=0; i<root_depth; i++) 
    //    strcpy(stack[top++], root_parts[i]);

    //// 处理每一级路径
    //for (int i=0; i<part_cnt; i++) {
    //    if (strcmp(parts[i], ".") == 0) continue;

    //    if (strcmp(parts[i], "..") == 0) {
    //        if (top > root_depth) top--; // 不能弹出根目录层级
    //    } else {
    //        strcpy(stack[top++], parts[i]);
    //    }
    //}

    //// 构建规范化路径
    //char norm_path[512] = {0};
    //for (int i=0; i<top; i++) {
    //    strcat(norm_path, stack[i]);
    //    if (i != top-1) strcat(norm_path, "/");
    //}

    //if(strcmp(command, ".") == 0){
    //    printf("cd .保持不变\n");
    //    return;
    //}
    //if(strcmp(command, "..") == 0){
    //    printf("cd ..退回上一级目录\n");
    //    printf("parts[part_cnt - 3] = %s\n", parts[part_cnt - 3]);
    //    snprintf(query, sizeof(query),
    //             "SELECT id, path FROM file_info WHERE filename='%s' AND username='%s' AND type='d' LIMIT 1",
    //             parts[part_cnt - 3], username
    //            );
    //    if (mysql_query(db, query)) {
    //        fprintf(stderr, "路径查询失败: %s\n", mysql_error(db));
    //        return;
    //    }
    //    if (!(res = mysql_store_result(db))) {
    //        fprintf(stderr, "获取结果失败: %s\n", mysql_error(db));
    //        return;
    //    }
    //    if ((row = mysql_fetch_row(res))) {
    //        *pwd = atoi(row[0]);
    //        strncpy(cur_dir, row[1], 256);
    //    } else {
    //        fprintf(stderr, "目标目录不存在: %s\n", parts[part_cnt - 2]);
    //    }
    //    mysql_free_result(res);
    //    return;
    //}
    // 查询数据库验证路径
    snprintf(query, sizeof(query),
             "SELECT id, path FROM file_info WHERE filename='%s' AND username='%s' AND type='d' LIMIT 1",
             parts[part_cnt], username
            );
    if (mysql_query(db, query)) {
        fprintf(stderr, "路径查询失败: %s\n", mysql_error(db));
        return;
    }
    if (!(res = mysql_store_result(db))) {
        fprintf(stderr, "获取结果失败: %s\n", mysql_error(db));
        return;
    }
    if ((row = mysql_fetch_row(res))) {
        *pwd = atoi(row[0]);
        strncpy(cur_dir, row[1], 256);
    } else {
        fprintf(stderr, "目标目录不存在: %s\n", parts[part_cnt]);
    }
    mysql_free_result(res);
}
